package ar.edu.utn.frba.tacs.warnes;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import ar.edu.utn.frba.tacs.warnes.pieza.Pieza;
import ar.edu.utn.frba.tacs.warnes.pieza.PiezaReservadaState;
import ar.edu.utn.frba.tacs.warnes.pieza.PiezaVendidaState;
import ar.edu.utn.frba.tacs.warnes.utils.ConstantesWarnes;
import ar.edu.utn.frba.tacs.warnes.utils.ContenedorWarnes;

public class EstadoPiezaTestCase {

	private ContenedorWarnes contenedor;
	private Pieza piezaDisponible;
	private Pieza piezaReservada;
	private Pieza piezaVendida;

	@Before
	public void inicializaciones() {
		this.contenedor = ContenedorWarnes.getInstance();
		this.piezaDisponible = this.contenedor.creaUnaPieza("Asiento");
		this.piezaReservada = this.contenedor.creaUnaPieza("Pedal");
		this.piezaReservada.cambiarEstado(PiezaReservadaState.getInstance());
		this.piezaVendida = this.contenedor.creaUnaPieza("Espejo");
		this.piezaVendida.cambiarEstado(PiezaVendidaState.getInstance());
	}

	@After
	public void limpiarContenedor() {
		this.contenedor.limpiate();
	}
	
	/**
	 * Testea el estado de las piezas
	 */
	@Test
	public void testPiezaDisponible(){
		assertTrue(this.piezaDisponible.estaDisponible());
		assertFalse(this.piezaReservada.estaDisponible());
		assertFalse(this.piezaVendida.estaDisponible());
	}

	/**
	 * Testea el estado de las piezas
	 */
	@Test
	public void testPiezaReservada(){
		assertFalse(this.piezaDisponible.estaReservada());
		assertTrue(this.piezaReservada.estaReservada());
		assertFalse(this.piezaVendida.estaReservada());
	}

	/**
	 * Testea el estado de las piezas
	 */
	@Test
	public void testPiezaVendida(){
		assertFalse(this.piezaDisponible.estaVendida());
		assertFalse(this.piezaReservada.estaVendida());
		assertTrue(this.piezaVendida.estaVendida());
	}

	/**
	 * Testea la consulta de las piezas segun un estado dado
	 */
	@Test
	public void testConsultaPiezasDisponibles(){
		@SuppressWarnings("unused")
		Pieza piezaDisponible2 = this.contenedor.creaUnaPieza("Motor");
		@SuppressWarnings("unused")
		Pieza piezaDisponible3 = this.contenedor.creaUnaPieza("Bujia");
		Pieza piezaVendida2 = this.contenedor.creaUnaPieza("Buje");
		piezaVendida2.cambiarEstado(PiezaVendidaState.getInstance());
		
		assertEquals(3, this.contenedor.getPiezas(ConstantesWarnes.PiezaState.DISPONIBLE).size());
		assertEquals(1, this.contenedor.getPiezas(ConstantesWarnes.PiezaState.RESERVADA).size());
		assertEquals(2, this.contenedor.getPiezas(ConstantesWarnes.PiezaState.VENDIDA).size());
	}
}
